   @Autowired
     private ItemService itemService;

     /**
      * 业务逻辑: 查询商品分页
      * URL: /item/getItemList?query=&pageNum=1&pageSize=10
      * 类型: GET
      * 接收参数: PageResult对象
      * 返回值: SysResult
      */
     @GetMapping("/getItemList")
     public SysResult getItemList(PageResult pageResult){//3个参数

         //返回5个参数,total/rows分页记录
         pageResult = itemService.getItemList(pageResult);
         return SysResult.success(pageResult);
     }
----------------------------------------------------------------------
 /**
     * 实现商品的分页操作
     * @param pageResult
     * @return
     */
    @Override
    public PageResult getItemList(PageResult pageResult) {
        //参数1:页数  参数2: 条数
        Page<Item> page = new Page<>(pageResult.getPageNum(),pageResult.getPageSize());
        QueryWrapper queryWrapper = new QueryWrapper();
        //如果参数有值true 如果query参数没有值 false
        boolean flag = StringUtils.hasLength(pageResult.getQuery());
        queryWrapper.like(flag,"title",pageResult.getQuery());
        //利用MP的分页API 实现查询
        page = itemMapper.selectPage(page,queryWrapper);
        long total = page.getTotal();
        List<Item> list = page.getRecords();
        //封装成功之后原来3个参数   封装之后变为5个 之后返回
        return pageResult.setTotal(total).setRows(list);
    }
----------------------------------------------------------------------
/**
     * 业务: 查询3级商品分类信息
     *      1. 一级中嵌套二级集合
     *      2. 二级菜单嵌套三级集合.
     *
     * 1.0版本: for循环嵌套结构  暂时不考虑level 最好理解的
     * 常识:
     *      1.用户第一次查询数据库 需要建立链接.
     *      2.第二次查询 从链接池中动态获取链接 所以速度更快!!!
     *
     *  思考: 该业务查询了多少次数据库??? 第一层循环10个  第二层循环10 总查询数=10*10=100次
     *       如何优化查询策略!!!!
     * @param level
     * @return
     */


    /*@Override
    public List<ItemCat> findItemCatList(Integer level) {
        //性能问题:!!!!!
        long startTime = System.currentTimeMillis();

        //1.查询一级商品分类信息
        QueryWrapper<ItemCat> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("parent_id", 0);
        List<ItemCat> oneList = itemCatMapper.selectList(queryWrapper);

        //2.查询二级商品分类信息  遍历一级集合
        for(ItemCat oneItemCat : oneList){
            queryWrapper.clear();   //清空条件
            queryWrapper.eq("parent_id", oneItemCat.getId());
            List<ItemCat> twoList = itemCatMapper.selectList(queryWrapper);

            //3.查询三级商品分类信息  遍历
            for(ItemCat twoItemCat : twoList){
                queryWrapper.clear();
                queryWrapper.eq("parent_id", twoItemCat.getId());
                List<ItemCat> threeList = itemCatMapper.selectList(queryWrapper);
                //将三级封装给二级
                twoItemCat.setChildren(threeList);
            }
            //3.将二级记录封装给一级
            oneItemCat.setChildren(twoList);
        }

        //记录程序的结束时间
        long endTime = System.currentTimeMillis();
        System.out.println("查询耗时:"+(endTime - startTime)+"毫秒");
        return oneList;
    }*/


*------------------------------------------------------
 /**
     * 1.封装Map集合   Map<Key=父级ID,value=List<ItemCat对象>>
     * 2.说明:  将所有的数据库的父子关系,进行封装.(没有嵌套!!!!)
     * 3.优势:  只查询一次数据库,就可以完成父子关系的封装.
     * 策略:
     * 1. key不存在, 准备一个新List集合,将自己当作第一个元素追加
     * 2. key存在,  获取原有list集合,将自己追加.
     */
    public Map<Integer, List<ItemCat>> initMap() {
        //Map中包含了所有的父子级关系.
        Map<Integer, List<ItemCat>> map = new HashMap<>();
        //1.查询item_cat表中的所有的记录(1/2/3级菜单)
        List<ItemCat> itemCatList = itemCatMapper.selectList(null);
        //2.实现数据的封装
        for (ItemCat itemCat : itemCatList) {
            int key = itemCat.getParentId();
            if (map.containsKey(key)) { //存在
                List<ItemCat> list = map.get(key);
                //将自己追加到其中
                list.add(itemCat);
            } else {  //不存在: 准备List集合,将自己作为第一个元素封装
                List<ItemCat> list = new ArrayList<>();
                list.add(itemCat);
                map.put(key, list);
            }
        }
        //将封装的数据进行返回.
        return map;
    }

------------------------------------------------------
    /**
     * level 1 只查询一级商品分类
     * 2 查询一级/二级  嵌套封装
     * 3 查询一级/二级/三级   嵌套封装
     *
     * @param level
     * @return
     */
    @Override
    public List<ItemCat> findItemCatList(Integer level) {
        long startTime = System.currentTimeMillis();
        //Map集合里边封装的是所有的父子级关系.、
        Map<Integer, List<ItemCat>> map = initMap();
        if (level == 1) { //只获取1级菜单. parent_id = 0
            return map.get(0);

        }
        //用户查询1/2级商品分类信息
        if (level == 2) {
            return getLevel2List(map);
        }


        //如果程序执行到这里,则说明用户查询的是1-2-3级菜单
        List<ItemCat> list = getLevel3List(map);
        long endTime = System.currentTimeMillis();
        System.out.println("耗时:" + (endTime - startTime) + "毫秒");
        return list;
    }
    --------------------------------------------------------------------.
     @Override
        @Transactional  //添加事务的控制
        public void deleteItemCat(Integer id, Integer level) {
            if (level == 3) {
                itemCatMapper.deleteById(id);
            }

            if (level == 2) {
                //1.先删除3级菜单
                QueryWrapper queryWrapper = new QueryWrapper();
                queryWrapper.eq("parent_id", id);
                itemCatMapper.delete(queryWrapper);
                //2.再删除2级菜单
                itemCatMapper.deleteById(id);
            }

            //如果程序执行到这一行 则需要先删除3级/再删除2级/最后删除1级
            if (level == 1) {
                List<Integer> ids = new ArrayList<>();
                //1.查询所有的二级菜单
                QueryWrapper queryWrapper = new QueryWrapper();
                queryWrapper.eq("parent_id", id);
                List<ItemCat> twoList = itemCatMapper.selectList(queryWrapper);
                for (ItemCat twoItemCat : twoList) {
                    //删除3级菜单
                    queryWrapper.clear();
                    queryWrapper.eq("parent_id", twoItemCat.getId());
                    //delete from item_cat where parent_id = "二级ID"
                    itemCatMapper.delete(queryWrapper);
                    //获取需要删除的ID信息
                    ids.add(twoItemCat.getId());
                }
                //将所有的二级/一级ID封装到List集合中
                ids.add(id);
                itemCatMapper.deleteBatchIds(ids);
            }
        }


